﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml.Linq;
using CROSLAND.BL.BE;
using CROSLAND.BL.BC;
using System.Collections.Generic;
using System.Text;

namespace CROSLAND.WebApp
{
    public partial class Stock : System.Web.UI.Page
    {
        #region TreeView Jerarquias
        protected void tvJerarquia_SelectedNodeChanged(object sender, EventArgs e)
        {
            //codigo para buscar materiales...
            this.buscaMateriales();
        }

        protected void tvJerarquia_TreeNodePopulate(object sender, TreeNodeEventArgs e)
        {
            if (e.Node.Value == "0")
            {
                List<JerarquiaBE> lstNivel1 = JerarquiaBC.Instance.listar(1);
                foreach (JerarquiaBE obj in lstNivel1)
                {
                    TreeNode root = new TreeNode(obj.Descripcion, obj.Jerarquia + ':' + obj.Nivel.ToString());
                    root.PopulateOnDemand = true;
                    e.Node.ChildNodes.Add(root);
                }
            }
            else
            {
                string[] aux = e.Node.Value.Split(':');
                List<JerarquiaBE> lstNiveli = JerarquiaBC.Instance.Buscar(Convert.ToInt32(aux[1]) + 1, aux[0]);
                foreach (JerarquiaBE obj in lstNiveli)
                {
                    TreeNode node = new TreeNode(obj.Descripcion, obj.Jerarquia + ':' + obj.Nivel.ToString());
                    node.PopulateOnDemand = true;
                    e.Node.ChildNodes.Add(node);
                }
            }
        }
        private void tvJerarquiasRender()
        {
            TreeNode tn = new TreeNode("TODAS", "0");
            tn.PopulateOnDemand = true;
            tn.Selected = true;
            tvJerarquia.Nodes.Add(tn);
        }
        #endregion

		decimal _totStockLibre = 0m, _totStockPedidoCliente = 0m, _totStockEntregaCliente = 0m;
        decimal _totStockDisponible = 0m, _totStockEnTransito = 0m;
        PedidoBE _lvObjPedido;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                UsuarioWebBE objUsuarioWeb = (UsuarioWebBE)Session["UsuarioWeb"];
                this.cargaDatos();
                this.tvJerarquiasRender();
                this.buscaMateriales();
                this.ocultarCol();
            }
        }

        //WEBDIST
        private void ocultarCol()
        {
           UsuarioWebBE objUsuarioWeb = (UsuarioWebBE)Session["UsuarioWeb"];
           if (objUsuarioWeb.sector == "01")
           {
               cgvMateriales.Columns[1].Visible = false;
              
          }
        }

        private void buscaMateriales()
        {
            try
            {
                List<MaterialBE> dt = new List<MaterialBE>(); MaterialBE objMat = null;
                UsuarioWebBE objUsuarioWeb = (UsuarioWebBE)Session["UsuarioWeb"];
                if (txtCodMaterial.Text == string.Empty)
                {
                    if (tvJerarquia.SelectedValue == "0")
                    {
                        dt = MaterialBC.Instance.buscarMateriales(txtMaterial.Text.Trim(), "", objUsuarioWeb.OrgVentas, objUsuarioWeb.CanalDist, objUsuarioWeb.OfVentas, objUsuarioWeb.Usuario, objUsuarioWeb.sector, objUsuarioWeb.centro, objUsuarioWeb.almacen);
                    }
                    else
                    {
                        dt = MaterialBC.Instance.buscarMateriales(txtMaterial.Text.Trim(), tvJerarquia.SelectedValue.Replace(":1", "").Replace(":2", ""), objUsuarioWeb.OrgVentas, objUsuarioWeb.CanalDist, objUsuarioWeb.OfVentas, objUsuarioWeb.Usuario, objUsuarioWeb.sector, objUsuarioWeb.centro, objUsuarioWeb.almacen);
                    }
                }
                else
                {
                    objMat = MaterialBC.Instance.leerMaterial(txtCodMaterial.Text.Trim(), objUsuarioWeb.OrgVentas, objUsuarioWeb.CanalDist, objUsuarioWeb.sector, objUsuarioWeb.OfVentas, objUsuarioWeb.Usuario, objUsuarioWeb.centro, objUsuarioWeb.almacen);
                    dt.Add(objMat);
                }
                Session["LMaterialBE"] = dt;
                cgvMateriales.DataSource = dt;
                cgvMateriales.DataBind();

                if (Session["PedidoTratado"] != null)
                {
                    if ((bool)Session["PedidoTratado"])
                    {
                        cgvMateriales.Columns[2].Visible = false;
                    }
                }
            }
            catch (Exception ex)
            {
                Session["Mensaje"] = ex.Message;
            }
            finally
            {
                ((Site2)Master).muestraMensajes();
            }
        }

	    private void cargaDatos()
        {
            if (Session["Pedido"] != null)
            {
                this._lvObjPedido = (PedidoBE)Session["Pedido"];
                if (this._lvObjPedido.Detalle != null && this._lvObjPedido.Detalle.Count > 0)
                {
                    dlMaterialesSelec.ShowFooter = false;
                    dlMaterialesSelec.DataSource = this._lvObjPedido.Detalle;
                }
                else
                {
                    dlMaterialesSelec.ShowFooter = true;
                    dlMaterialesSelec.DataSource = new DataTable();
                }
                dlMaterialesSelec.DataBind();
            }
            else { 
                //lst_OrgVentas = ClienteBC.Instance.listaOrgVtas( "");
                //lst_CanalDist = ClienteBC.Instance.listaCanalDist("","1000");
            }
        }

        protected void ibtnBuscar_Click(object sender, ImageClickEventArgs e)
        {
            
        }

        protected void txtMaterial_TextChanged(object sender, EventArgs e)
        {
            this.buscaMateriales();
        }

        protected void txtCodMaterial_TextChanged(object sender, EventArgs e)
        {
            this.buscaMateriales();
        }

        protected void cgvMateriales_DataBound(object sender, EventArgs e)
        {
            string op = "";
            if (Session["Operacion"] != null)
            {
                op = Session["Operacion"].ToString().ToLower();
                if (Session["Pedido"] != null && Session["Cliente"] != null)
                {
                    PedidoBE objPedido = (PedidoBE)Session["Pedido"];
                    if (!string.IsNullOrEmpty(objPedido.CodTipoDoc))
                    {
                        cgvMateriales.Columns[0].Visible = true;
                    }
                }
            }

            
        }

        private void calculaFechaEntregaItem(DetalleBE objDetalle)
        {
            DateTime fechaCalculada, fechaActual = DateTime.Today;
            double factor = 0;
            //----

            if (ParametroBC.Instance.esTipoX(objDetalle.PrioridadEntrega, "CodPrioEntMas2"))
            {
                factor = 2;
            }
            else if (ParametroBC.Instance.esTipoX(objDetalle.PrioridadEntrega, "CodPrioEntMas1"))
            {
                factor = 1;
            }
            else
            {
                factor = 0;
            }
            //-----
            int count = Convert.ToInt32(factor);
            //Si es domingo pasa como si fuera lunes
            if (fechaActual.DayOfWeek == DayOfWeek.Sunday)
            {
                count += 1;
            }
            fechaCalculada = fechaActual;
            for (int i = 1; i <= count; i++)
            {
                fechaCalculada = fechaCalculada.AddDays(1);
                if (fechaCalculada.DayOfWeek == DayOfWeek.Sunday)
                {
                    fechaCalculada = fechaCalculada.AddDays(1);
                }
            }


            //--- múltiples fechas de reparto:
            if (objDetalle.Repartos.Count == 0) { objDetalle.Repartos.Add(new RepartoBE()); }
            foreach (RepartoBE itmRep in objDetalle.Repartos)
            {
                if (fechaCalculada > itmRep.FechaEntrega)
                {
                    itmRep.FechaEntrega = fechaCalculada;
                }
                else if (itmRep.FechaEntrega.DayOfWeek == DayOfWeek.Sunday)
                {
                    itmRep.FechaEntrega = itmRep.FechaEntrega.AddDays(1);
                }
            }
        }

        private string addItem(string pCodMat, decimal pCant)
        {
            string retMsg = "";

            try
            {
                this._lvObjPedido = (PedidoBE)Session["Pedido"];
                List<DetalleBE> lstMateriales = (this._lvObjPedido.Detalle == null) ? new List<DetalleBE>() : this._lvObjPedido.Detalle;

                DetalleBE objDetalle = new DetalleBE();
                objDetalle.CodMaterial = pCodMat;
                objDetalle.Cantidad = pCant;

                MaterialBE objMaterial = null;
                UsuarioWebBE uw = new UsuarioWebBE();
                if (Session["UsuarioWeb"] != null)
                {
                    uw = (UsuarioWebBE)Session["UsuarioWeb"];    
                }                

                if (Session["LMaterialBE"] == null)
                {
                    objMaterial = MaterialBC.Instance.leerMaterial(objDetalle.CodMaterial, uw.OrgVentas, uw.CanalDist, uw.sector, uw.OfVentas, uw.Usuario, uw.centro, uw.almacen);
                }
                else
                {
                    objMaterial = ((List<MaterialBE>)Session["LMaterialBE"]).Find(x => x.CodMaterial == objDetalle.CodMaterial);
                    objMaterial = objMaterial == null ? MaterialBC.Instance.leerMaterial(objDetalle.CodMaterial, uw.OrgVentas, uw.CanalDist, uw.sector, uw.OfVentas, uw.Usuario, uw.centro, uw.almacen) : objMaterial;
                }

                
                if (objMaterial != null)
                {
                    objDetalle.DescMaterial = objMaterial.DescMaterial;
                    objDetalle.CodUMedida = objMaterial.CodUMedida;
                    objDetalle.Peso = objMaterial.Peso;
                    objDetalle.UMedidaRendimiendo = objMaterial.UMedidaRendimiendo;
                    objDetalle.ValorRendimiento = objMaterial.ValorRendimiento;
                    objDetalle.TipoMaterial = objMaterial.TipoMaterial;

                    objDetalle.Material = objMaterial;
                    
                    //si UM = UNidad => redondear al entero mayor
                    if (ParametroBC.Instance.esTipoX(objDetalle.CodUMedida, "UMUnidad"))
                    {
                        objDetalle.Cantidad = (objDetalle.Cantidad > decimal.Truncate(objDetalle.Cantidad)) ? decimal.Truncate(objDetalle.Cantidad) + 1 : objDetalle.Cantidad;
                    }

                    bool auxC = false;
                    //--- cargar data de prioridad de entrega en base a la cond de exp.
                    if (!string.IsNullOrEmpty(this._lvObjPedido.CondExp))
                    {
                        objDetalle.PrioridadEntrega = this._lvObjPedido.CondExp;
                        auxC = true;
                    }
                    /*20110714 Inicio WCA  */
                    string canalesCondDesNor = ParametroBC.Instance.getParamValue("CondPriorDespNormal");
    
                    objDetalle.Repartos[0].CantPed = objDetalle.Cantidad;
                    objDetalle.Repartos[0].CantConf = objDetalle.Cantidad;
                    //--- cálculo de posición
                    string tmpPos = "";
                    if (lstMateriales.Count > 0)
                    {
                        tmpPos = lstMateriales[lstMateriales.Count - 1].Posicion;
                    }
                    else
                    {
                        tmpPos = "00";
                    }
                    int posi = Convert.ToInt16(tmpPos) + 10;
                    objDetalle.Posicion = posi.ToString();

                    lstMateriales.Add(objDetalle);
                    this._lvObjPedido.Detalle = lstMateriales;
                    Session["Pedido"] = this._lvObjPedido;
                }
                else
                {
                    retMsg = "No se encontró el material.";
                }
            }
            catch (Exception ex)
            {
                retMsg = ex.Message;
            }
            return retMsg;
        }

        protected void cgvMateriales_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                int idx = Convert.ToInt32(e.CommandArgument);
                GridViewRow gvr = cgvMateriales.Rows[idx];
                string mID = string.Empty;// = gvr.Cells[2].Text;
                Label lblCodigo = (Label)gvr.FindControl("lblCodigo");
                if (lblCodigo != null) { mID = lblCodigo.Text; }

                if (e.CommandName == "Detalle")
                {
                    List<MaterialBE> listaMat = MaterialBC.Instance.buscarMaterialesReemplazo(mID);
                    StringBuilder str = new StringBuilder();
                    str.Append("<table class='tbl-detalle' width='500px'>");
                    str.Append("    <tr>");
                    str.Append("        <td>Material</td>");
                    str.Append("        <td>Descripción</td>");
                    str.Append("        <td>UM</td>");
                    str.Append("        <td>Marca</td>");
                    str.Append("        <td>Modelo</td>");
                    str.Append("    </tr>");

                    if (listaMat.Count > 0)
                    {
                        foreach (MaterialBE item in listaMat)
                        {
                            str.Append("    <tr>");
                            str.Append("        <td>" + item.CodMaterialCorto + "</td>");
                            str.Append("        <td>" + item.DescMaterial + "</td>");
                            str.Append("        <td>" + item.CodUMedida + "</td>");
                            str.Append("        <td>" + item.marca + "</td>");
                            str.Append("        <td>" + item.modelo + "</td>");
                            str.Append("    </tr>");
                        }
                    }
                    else 
                    {
                        str.Append("    <tr>");
                        str.Append("        <td colspan='5'>Para el material " + mID + " no existe cadena de Reemplazo.</td>");
                       
                        str.Append("    </tr>");
                    }


                    str.Append("</table>");

                    Label lbl = (Label)gvr.FindControl("lblDetalle");
                    lbl.Text = str.ToString();

                    lbl.Visible = !lbl.Visible;
                    

                }
                if (e.CommandName == "AddItem")
                {
                    if (Session["Cliente"] == null)
                    {
                        Session["Mensaje"] = "Debe indicar el solicitante antes de añadir los materiales.";
                    }
                    else if (string.IsNullOrEmpty(mID.Trim()))
                    {
                        Session["Mensaje"] = "Código de material inválido.";
                    }
                    else
                    {
                        decimal cant = 1m;
                        string retVal = this.addItem(mID, cant);

                        if (retVal.Equals(""))
                        {
                            this._lvObjPedido = (PedidoBE)Session["Pedido"];
                            if (this._lvObjPedido.Detalle.Count > 0) { dlMaterialesSelec.ShowFooter = false; }
                            dlMaterialesSelec.DataSource = this._lvObjPedido.Detalle;
                            dlMaterialesSelec.DataBind();
                            upMaterialesSelec.Update();
                        }
                        else
                        {
                            //mensaje de error
                            Session["Mensaje"] = retVal;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                if (e.CommandName == "Detalle")
                {
                    Session["Mensaje"] = "El material seleccionado no cuenta con materiales de reemplazo";
                }
                else
                {
                    Session["Mensaje"] = ex.Message;
                }
            }
            finally
            {
                ((Site2)Master).muestraMensajes();
            }
        }

        protected void dlMaterialesSelec_ItemCommand(object source, DataListCommandEventArgs e)
        {
            try
            {
                if (e.CommandName == "DelItem")
                {
                    HiddenField hid2 = (HiddenField)e.Item.FindControl("hidMaterialId");
                    string mID = hid2.Value;

                    List<DetalleBE> lstMateriales;
                    this._lvObjPedido = (PedidoBE)Session["Pedido"];
                    lstMateriales = (this._lvObjPedido.Detalle == null) ? new List<DetalleBE>() : this._lvObjPedido.Detalle;
                    lstMateriales.RemoveAll(X => X.PosSup == lstMateriales[e.Item.ItemIndex].Posicion);
                    lstMateriales.RemoveAt(e.Item.ItemIndex);
                    this._lvObjPedido.Detalle = lstMateriales;
                    Session["Pedido"] = this._lvObjPedido;

                    dlMaterialesSelec.ShowFooter = false;
                    if (lstMateriales.Count == 0) { dlMaterialesSelec.ShowFooter = true; }
                    dlMaterialesSelec.DataSource = lstMateriales;
                    dlMaterialesSelec.DataBind();
                }
            }
            catch (Exception ex)
            {
                Session["Mensaje"] = ex.Message;
            }
            finally
            {
                ((Site2)Master).muestraMensajes();
                upMaterialesSelec.Update();
            }
        }

        private void resetTotalesStock()
        {
            _totStockDisponible = 0m;
            _totStockDisponible = 0m; _totStockEnTransito = 0m;
        }

        protected void gvStock_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                this._totStockDisponible += Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, "StockDisponible"));
                this._totStockLibre += Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, "StockLibre"));
                this._totStockPedidoCliente += Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, "StockPedidoCliente"));
                this._totStockEntregaCliente += Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, "StockEntregaCliente"));
                this._totStockEnTransito += Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, "StockEnTransito"));
            }
            else if (e.Row.RowType == DataControlRowType.Footer)
            {
                string charStockMax = ParametroBC.Instance.getParamValue("stockMayor");
                //validamos que sea un usuario de distribucion
                if (Session["usuarioDistribucion"] != null)
                {
                    if (Session["usuarioDistribucion"].ToString() == "ok")
                    {
                        e.Row.Cells[3].Text = (this._totStockDisponible > Convert.ToDecimal(charStockMax)) ? "> " + charStockMax : string.Format("{0:0,0.000}", _totStockDisponible);
                    }
                    else
                    {
                        e.Row.Cells[3].Text = string.Format("{0:0,0.000}", this._totStockDisponible);
                    }
                }

                e.Row.Cells[3].HorizontalAlign = HorizontalAlign.Right;
             }
        }

        protected void ibtnBuscar_Click(object sender, EventArgs e)
        {
            buscaMateriales();
        }

        protected void cgvMateriales_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                //GridView gv = (GridView)e.Row.FindControl("gvDetalle");

                //string mID = DataBinder.Eval(e.Row.DataItem, "CodMaterialCorto").ToString();
                //gv.DataSource = MaterialBC.Instance.buscarMaterialesReemplazo(mID);
                //gv.DataBind();
            }
        }
    }
}
